const { verifyToken } = require('../utils/jwt');
const Visitor = require('../models/Visitor');

/**
 * 验证访客JWT令牌的中间件
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件函数
 */
exports.verifyVisitorToken = async (req, res, next) => {
    try {
        // 从请求头获取token
        const authHeader = req.headers.authorization;
        if (!authHeader || !authHeader.startsWith('Bearer ')) {
            return res.status(401).json({
                success: false,
                message: '未提供访问令牌'
            });
        }
        
        // 提取token
        const token = authHeader.split(' ')[1];
        
        // 验证token
        const decoded = verifyToken(token);
        if (!decoded) {
            return res.status(401).json({
                success: false,
                message: '访问令牌无效或已过期'
            });
        }
        
        // 验证token中的用户类型是否为访客
        if (decoded.type !== 'visitor') {
            return res.status(403).json({
                success: false,
                message: '访问令牌类型不正确'
            });
        }
        
        // 查找访客是否存在
        const visitor = await Visitor.findByPk(decoded.uuid);
        if (!visitor) {
            return res.status(404).json({
                success: false,
                message: '访客不存在'
            });
        }
        
        // 检查访客状态是否被禁用
        if (visitor.status !== 'active') {
            return res.status(403).json({
                success: false,
                message: '访客账号已被禁用'
            });
        }
        
        // 将访客信息添加到请求对象，供后续中间件使用
        req.visitor = {
            uuid: visitor.uuid,
            avatar: visitor.avatar,
            createdAt: visitor.createdAt,
            status: visitor.status
        };
        
        // 继续处理请求
        next();
    } catch (error) {
        console.error('访客令牌验证错误:', error);
        return res.status(500).json({
            success: false,
            message: '服务器内部错误',
            error: process.env.NODE_ENV === 'development' ? error.message : undefined
        });
    }
}; 